البرمجة

برمجة الكائنات في جافاسكريبت

جدول المحتوى

برمجة الكائنات (Objects) في جافاسكريبت: المفهوم، الآليات، والتطبيقات المتقدمة

تُعتبر برمجة الكائنات (Object-Oriented Programming – OOP) إحدى الركائز الأساسية في تطوير البرمجيات الحديثة، وقد لعبت دورًا حيويًا في تحسين بنية الشيفرات، تنظيمها، وتسهيل إعادة استخدامها. في بيئة جافاسكريبت، تُعد الكائنات (Objects) جزءًا جوهريًا من البنية اللغوية للغة، وتُستخدم بكثرة في مختلف أنماط البرمجة، سواء البرمجة الكائنية أو البرمجة الوظيفية أو حتى البرمجة التفاعلية عبر المتصفح.

في هذا المقال، سيتم تناول مفهوم الكائنات في جافاسكريبت بشكل موسع، مع الغوص في خصائصها، كيفية تعريفها، التعامل معها، أنماط التصميم المرتبطة بها، بالإضافة إلى الممارسات المتقدمة لإدارتها ضمن المشاريع البرمجية الاحترافية.


تعريف الكائنات في جافاسكريبت

الكائن (Object) في جافاسكريبت هو بنية بيانات معقدة تُستخدم لتخزين مجموعات من القيم والعلاقات بينها. يحتوي كل كائن على خصائص (Properties) وطرق (Methods). الكائن يُشبه في جوهره قاموسًا يحتوي على أزواج من المفاتيح والقيم (key-value pairs).

javascript
let person = { name: "Ahmed", age: 30, greet: function () { console.log("Hello, my name is " + this.name); } };

في المثال أعلاه، person هو كائن يحتوي على خاصيتين name و age، وطريقة greet.


الطرق المختلفة لإنشاء الكائنات

1. إنشاء كائن باستخدام Object Literal

الطريقة الأكثر شيوعًا والأبسط:

javascript
let car = { brand: "Toyota", model: "Corolla", year: 2022 };

2. استخدام Constructor Function

يتم فيها إنشاء نموذج عام لكائنات متعددة:

javascript
function Car(brand, model, year) { this.brand = brand; this.model = model; this.year = year; } let myCar = new Car("Honda", "Civic", 2020);

3. استخدام Object.create()

إنشاء كائن مع تحديد النموذج الأولي:

javascript
let animal = { speak: function () { console.log("Animal makes a sound"); } }; let dog = Object.create(animal); dog.speak(); // Animal makes a sound

4. استخدام Class Syntax (إضافة حديثة في ES6)

javascript
class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { console.log(`Hello, my name is ${this.name}`); } } const p = new Person("Mona", 25); p.greet();

خصائص الكائنات

تتكون الكائنات من مجموعة من الخصائص (properties)، وكل خاصية عبارة عن مفتاح (key) وقيمة (value). يمكن أن تكون القيم عبارة عن بيانات بدائية، كائنات أخرى، أو حتى دوال (methods).

javascript
let book = { title: "JavaScript Guide", pages: 350, author: { name: "Ali", nationality: "Egyptian" } };

الطرق (Methods) والتعامل مع this

الطرق هي دوال تُخزن داخل الكائنات وتُنفذ باستخدام الكلمة المفتاحية this التي تشير إلى الكائن الحالي.

javascript
let user = { name: "Laila", sayHi: function () { console.log("Hi, I am " + this.name); } }; user.sayHi(); // Hi, I am Laila

الوصول إلى الخصائص وتعديلها

الوصول

javascript
console.log(book.title); // dot notation console.log(book["title"]); // bracket notation

التعديل

javascript
book.pages = 400; book["title"] = "Advanced JS Guide";

الحذف والإضافة

إضافة خاصية جديدة

javascript
book.language = "Arabic";

حذف خاصية

javascript
delete book.author;

تكرار الكائنات (Iteration)

يمكن استخدام حلقة for...in لتكرار خصائص الكائن:

javascript
for (let key in book) { console.log(key + ": " + book[key]); }

نسخ الكائنات

مرجع مقابل نسخ حقيقية

الكائنات تُمرر كمرجع وليس كقيمة:

javascript
let obj1 = { a: 1 }; let obj2 = obj1; obj2.a = 2; console.log(obj1.a); // 2

استخدام Object.assign

javascript
let clone = Object.assign({}, obj1);

استخدام Spread Operator

javascript
let clone2 = { ...obj1 };

الكائنات المُتداخلة (Nested Objects)

الكائنات يمكن أن تحتوي على كائنات أخرى كقيم:

javascript
let company = { name: "TechCorp", departments: { development: { teamLead: "Nour", members: 8 }, hr: { teamLead: "Khaled", members: 3 } } };

مفهوم الوراثة في كائنات جافاسكريبت

الوراثة هي إحدى ركائز البرمجة الكائنية. في جافاسكريبت، الوراثة تُطبق عبر السلسلة النموذجية (Prototype Chain).

النموذج الأولي (Prototype)

كل كائن في جافاسكريبت لديه خاصية خفية [[Prototype]] والتي تُستخدم كوراثة خصائص من كائن آخر.

javascript
let animal = { eats: true }; let rabbit = Object.create(animal); console.log(rabbit.eats); // true

الجدول التالي يوضح الفرق بين الطرق المختلفة لإنشاء الكائنات:

الطريقة قابلة لإعادة الاستخدام تدعم الوراثة التعقيد
Object Literal لا نعم بسيط
Constructor Function نعم نعم متوسط
Object.create نعم نعم متوسط
Class Syntax نعم نعم عالي

الكائنات في السياق العملي والتطبيقي

في تطبيقات جافاسكريبت الحديثة، يتم استخدام الكائنات في مجموعة متنوعة من السياقات:

  • DOM API: كل عنصر في واجهة المستخدم يتم تمثيله ككائن.

  • AJAX و Fetch API: البيانات تُرسل وتُستقبل على شكل كائنات JSON.

  • البرمجة الكائنية: لتجسيد المفاهيم مثل المستخدم، السيارة، الطلب، إلخ.

  • State Management: في تطبيقات React مثلاً، تُخزن الحالة على شكل كائنات.


خصائص متقدمة للكائنات

الإخفاء (Encapsulation)

عبر استخدام النطاق (scope) والإغلاق (closure)، يمكن إخفاء الخصائص الحساسة:

javascript
function User(name) { let password = "secret"; this.name = name; this.authenticate = function (pass) { return pass === password; }; }

التجريد (Abstraction)

تُستخدم الكائنات لتجريد التفاصيل المعقدة عن المستخدم النهائي للواجهة البرمجية.

التعدد (Polymorphism)

يمكن لكائنات مختلفة أن تستخدم نفس الطريقة ولكن بأساليب مختلفة:

javascript
class Animal { speak() { console.log("Animal sound"); } } class Dog extends Animal { speak() { console.log("Bark"); } }

الممارسات الجيدة عند استخدام الكائنات

  • استخدم أسماء واضحة وذات دلالة للخصائص.

  • نظّم الكائنات بشكل منطقي لتسهيل القراءة.

  • لا تضع الكثير من البيانات في كائن واحد.

  • استخدم الأساليب الحديثة مثل class بدلاً من function constructor إذا كانت مدعومة.

  • استخدم Object.freeze للكائنات الثابتة لمنع تعديلها.

  • تجنب التكرار من خلال الوراثة أو التركيبات المركبة.


التفاعل مع JSON

JSON (JavaScript Object Notation) هو تنسيق لتخزين البيانات على هيئة كائنات جافاسكريبت.

javascript
let jsonString = '{"name":"Omar","age":28}'; let obj = JSON.parse(jsonString); let backToString = JSON.stringify(obj);

استخدام الكائنات في تصميم الأنماط (Design Patterns)

النمط المفرد Singleton

javascript
const Singleton = (function () { let instance; function createInstance() { return { name: "Single Instance" }; } return { getInstance: function () { if (!instance) instance = createInstance(); return instance; } }; })();

نمط المصنع Factory

javascript
function createUser(name, role) { return { name: name, role: role, describe: function () { console.log(`${this.name} works as ${this.role}`); } }; }

الخاتمة

برمجة الكائنات في جافاسكريبت تشكل قلب تطوير البرمجيات باستخدام هذه اللغة، سواء في المشاريع البسيطة أو تطبيقات الويب الكبيرة والمعقدة. فهم كيفية إنشاء الكائنات، إدارتها، وتوسيعها هو مهارة أساسية لكل مبرمج جافاسكريبت محترف. من خلال الاستفادة من إمكانيات النموذج الأولي، الوراثة، الأنماط التصميمية، والتفاعل مع البيانات الخارجية عبر JSON، يمكن تطوير حلول مرنة، قابلة للتوسع، وسهلة الصيانة.


المصادر:

  1. Eloquent JavaScript by Marijn Haverbeke (Third Edition)

  2. MDN Web Docs: JavaScript Objectshttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects